package com.linkgie.galaxyframework.service.domain.intf;

import java.util.Iterator;

import com.linkgie.galaxyframework.domain.data.Domain;
import com.linkgie.galaxyframework.domain.data.DomainClass;
import com.linkgie.galaxyframework.domain.data.DomainEnum;
import com.linkgie.galaxyframework.domain.data.DomainPackage;
import com.linkgie.galaxyframework.domain.data.DomainType;
import com.linkgie.galaxyframework.service.domain.data.DomainDetails;

/**
 * 领域服务；
 * 
 * @author huanghaiquan
 *
 */
public interface DomainService {

	/**
	 * 返回全部的业务领域；
	 * 
	 * @return
	 */
	Iterator<Domain> getDomains();

	/**
	 * 返回全部的业务领域；
	 * 
	 * @return
	 */
	default Iterator<DomainDetails> getDomainDetails() {
		return getDomainDetails(null, null);
	}

	/**
	 * 返回业务领域；
	 * 
	 * @param supportedCustomTypes 是否过滤自定义类型支持属性；<br>
	 *                             如果设置为 true ，则只返回支持自定义类型的领域；<br>
	 *                             如果设置为 false ，则只返回不支持自定义类型的领域；<br>
	 *                             如果设置为 null，则返回全部的领域；
	 * @return
	 */
	default Iterator<DomainDetails> getDomainDetails(Boolean supportedCustomTypes) {
		return getDomainDetails(null, supportedCustomTypes);
	}

	/**
	 * 返回业务领域；
	 * 
	 * @param sourceCode 领域源的编码； <br>
	 *                   如果设置为非空，则过滤掉所有不匹配参数值（忽略大小写）的领域源提供的领域； <br>
	 *                   如果设置为空，则不会按领域源对结果进行过滤；
	 * @return
	 */
	default Iterator<DomainDetails> getDomainDetails(String sourceCode) {
		return getDomainDetails(sourceCode, null);
	}

	/**
	 * 返回业务领域；
	 * 
	 * @param sourceCode           领域源的编码； <br>
	 *                             如果设置为非空，则过滤掉所有不匹配参数值（忽略大小写）的领域源提供的领域； <br>
	 *                             如果设置为空，则不会按领域源对结果进行过滤；
	 * @param supportedCustomTypes 是否过滤自定义类型支持属性；<br>
	 *                             如果设置为 true ，则只返回支持自定义类型的领域；<br>
	 *                             如果设置为 false ，则只返回不支持自定义类型的领域；<br>
	 *                             如果设置为 null，则不会按自定义类型支持属性对结果进行过滤；
	 * @return
	 */
	Iterator<DomainDetails> getDomainDetails(String sourceCode, Boolean supportedCustomTypes);

	/**
	 * 获取“领域”；
	 * 
	 * @param domainUri 领域URI；
	 * @return “领域”实例；如果不存在，则返回 null ；
	 */
	Domain getDomain(String domainUri);

	/**
	 * 返回指定的包 URI 所属的领域；
	 * 
	 * @param packageUri
	 * @return
	 */
	Domain getDomainOfPackage(String packageUri);

	/**
	 * 返回指定业务代码下所有的包；
	 * 
	 * @param domainUri
	 * @return
	 */
	Iterator<DomainPackage> getPackages(String domainUri);

	/**
	 * 获取指定 URI 表示的包；
	 * <p>
	 * 如果不存在，则返回 null；
	 * <p>
	 * 
	 * @param packageUri
	 * @return 包；
	 */
	DomainPackage getPackage(String packageUri);

	/**
	 * 获取指定 URI 表示的包的直接子包；
	 * <p>
	 * 如果不存在，则返回 null；
	 * 
	 * @param packageUri
	 * @return 包；
	 */
	Iterator<DomainPackage> getSubPackages(String packageUri);

	/**
	 * 返回指定的包下全部的领域类型；
	 * <p>
	 * 
	 * 不包括子包下的类型；
	 * 
	 * @param packageUri
	 * @return
	 */
	Iterator<DomainClass> getDomainClasses(String packageUri);

	/**
	 * 返回指定的包下全部的领域枚举；
	 * <p>
	 * 
	 * 不包括子包下的枚举；
	 * 
	 * @param packageUri
	 * @return
	 */
	Iterator<DomainEnum> getDomainEnums(String packageUri);

	/**
	 * 返回指定的包下全部的类型，包括类和枚举；
	 * <p>
	 * 
	 * 不包括子包下的类型；
	 * 
	 * @param packageUri
	 * @return
	 */
	Iterator<DomainType> getDomainTypes(String packageUri);

	/**
	 * 获取类型；
	 * 
	 * @param classUri
	 * @return
	 */
	DomainClass getDomainClass(String classUri);

	/**
	 * 获取枚举；
	 * 
	 * @param enumUri
	 * @return
	 */
	DomainEnum getDomainEnum(String enumUri);

}